/**
 1.观察者模式原理
 观察者模式定义：简单地说，观察者模式定义了一个一对多的依赖关系，让一个或多个
 观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖
 于此对象的那些观察者对象，使这些观察者对象能够自动更新

 2.观察者模式实现
 Subject (被观察的对象接口)
 规定ConcreteSubject的统一接口
 每个Subject可以有多个Observer
 ConcretedSubject （具体被观察对象)
 维护对所有具体观察者的引用的列表
 状态发生变化时会发送通知给所有注册的观察者
 Observer（观察者接口)
 规定ConcreteObserver的统一接口
 定义了一个update（）方法
 在被观察对象状态改变时会被调用
 ConcreteObserver(具体观察者）
 维护一个对ConcreteSubject的引用
 特定状态与Concretesubject同步
 实现Observer接口，通过update（）方法
 接收Concretesubject的通知
 --------------------------------------------------------
 interface
  subject
 1.registerObserver（）           observers       interface
 2.removeObserver()               ------->          observer
 3.notifyObservers()                                update()
        ^                                               ^
        |                                               |
        |                                               |
ConcreteSubject                                         |
 1.registerObserver()
 2.removeObserver()               subject       ConcreteObserver
 3.notifyObservers()             <--------          update()
 4.//other methods()                               //other methods()
 */

package 第十九章_图形类GUI.观察者模式;

import org.junit.Test;

public class 观察者模式 {
    @Test
    public void run(){
        Message message=new Message();
        Observer user1=new User("tom") ;
        Observer user2=new User("lucy");
        Observer user3=new User("momo");
        //加入 list 中
        message.registerObserver(user1);
        message.registerObserver(user2);
        message.registerObserver(user3);
        message.removeObserver(user2);
        message.setMessage("hi,this is ,.,");
        message.registerObserver(user2);
        message.setMessage("password 123..");
    }
}
